package modelos.daos;

import controladores.ManejadorBaseDatos;
import modelos.pojos.Reserva;
import modelos.pojos.ReservaHabitacion;
import java.sql.*;
import java.util.LinkedList;
import java.util.List;

public class ReservaHabitacionDAO {

    private static Connection con;
    public static List<ReservaHabitacion> resultados;

    public static void crear(ReservaHabitacion reservaHabitacion) throws SQLException, Exception {

        ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
        mbd.conectar();
        con = mbd.getConexion();

        if (con == null) {
            throw new SQLException("Ha ocurrido un error al intentar conectarse con la base de datos");
        }

        PreparedStatement pst = null;

        try {
            pst = con.prepareStatement("Insert Into ReservaHabitacion values(?,?,?,?,?,?)");
            pst.setString(1, null);
            pst.setInt(2, ReservaDAO.consultar(reservaHabitacion.getReserva().getCodigoReserva()).getId());
            pst.setInt(3, reservaHabitacion.getHabitacion().getId());
            pst.setTimestamp(4, new Timestamp(reservaHabitacion.getFechaProgIn().getTime()));
            pst.setTimestamp(5, new Timestamp(reservaHabitacion.getFechaProgOut().getTime()));
            pst.setString(6, reservaHabitacion.getEstado() + "");
            pst.executeUpdate();


        } finally {

            if (pst != null) {
                pst.close();
            }
        }

    }

    public static ReservaHabitacion consultar(String codigoReserva, String numeroHabitacion) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        ReservaHabitacion reserva = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Select ReservaHabitacion.*,Habitacion.numero,Reserva.codigoReserva from ReservaHabitacion inner join Habitacion inner join Reserva on ReservaHabitacion.idHabitacion = Habitacion.id and ReservaHabitacion.idReserva = Reserva.id and ReservaHabitacion.idReserva = ? and ReservaHabitacion.idHabitacion = ?;");
            pst.setInt(1, ReservaDAO.consultar(codigoReserva).getId());
            pst.setInt(2, HabitacionDAO.consultar(numeroHabitacion).getId());
            rs = pst.executeQuery();

            while (rs.next()) {
                reserva = ReservaHabitacion.cargarDatos(rs);
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return reserva;
        }
    }

    public static List listarReservasHabitaciones(String codigoReserva) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = new LinkedList<ReservaHabitacion>();

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Select ReservaHabitacion.*, Habitacion.numero, Reserva.codigoReserva from ReservaHabitacion inner join Habitacion inner join Reserva on ReservaHabitacion.idHabitacion = Habitacion.id and ReservaHabitacion.idReserva = ? and ReservaHabitacion.estado='a' and Reserva.id = ReservaHabitacion.idReserva");
            pst.setInt(1, ReservaDAO.consultar(codigoReserva).getId());
            rs = pst.executeQuery();

            while (rs.next()) {
                resultados.add(ReservaHabitacion.cargarDatos(rs));
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultados;
        }
    }

    public static void actualizar(ReservaHabitacion reservaHabitacion) throws SQLException, Exception {

        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update ReservaHabitacion set fechaProgIn=?, fechaProgOut=?,idHabitacion=? WHERE  id=?;");
            pst.setTimestamp(1, new Timestamp(reservaHabitacion.getFechaProgIn().getTime()));
            pst.setTimestamp(2, new Timestamp(reservaHabitacion.getFechaProgOut().getTime()));
            pst.setInt(3, reservaHabitacion.getHabitacion().getId());
            pst.setInt(4, reservaHabitacion.getId());
            pst.executeUpdate();


        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }

    public static List consultarCheckables(Reserva reserva, java.util.Date fecha) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select ReservaHabitacion.*, Habitacion.numero, Reserva.codigoReserva from ReservaHabitacion, Habitacion, Reserva where ReservaHabitacion.idHabitacion = Habitacion.id and ReservaHabitacion.idReserva = Reserva.id and ReservaHabitacion.fechaProgIn = ? and idReserva = ? and ReservaHabitacion.estado='a';");
            pst.setTimestamp(1, new Timestamp(fecha.getTime()));
            pst.setInt(2, reserva.getId());
            rs = pst.executeQuery();

            while (rs.next()) {
                if(resultados==null)
                    resultados = new LinkedList<ReservaHabitacion>();
                resultados.add(ReservaHabitacion.cargarDatos(rs));
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultados;
        }
    }

    public static void cambiarEstado(ReservaHabitacion reservaHabitacion, char estado) throws SQLException, Exception {

        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update ReservaHabitacion set estado=? WHERE  id = ?;");
            pst.setString(1, estado+"");
            pst.setInt(2, reservaHabitacion.getId());
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }
}
